package com.mgq.java8.option;

import com.mgq.java8.option.c2.Chestnut;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * <b>功能：</b>最佳实践<br>
 * 这里列出两个常见的使用方式，值类型转换和集合元素过滤 <br>
 * <b>Copyright mgq</b>
 * <li>版本&nbsp;&nbsp;&nbsp;&nbsp;修改日期&nbsp;&nbsp;&nbsp;&nbsp;部　　门&nbsp;&nbsp;&nbsp;&nbsp;作　者&nbsp;&nbsp;&nbsp;&nbsp;变更内容</li><hr>
 * <li>v1.0&nbsp;&nbsp;&nbsp;&nbsp;20220404&nbsp;&nbsp;营业后台&nbsp;&nbsp;&nbsp;&nbsp;马广奇&nbsp;&nbsp;&nbsp;&nbsp;创建类</li>
 * <br><br>
 *
 * @author 马广奇
 * @version 2022-04-04 22:24
 */
public class BestPractice {
    /**
     * 示例一
     */
    public static String test(Chestnut chestnut) {
        if (chestnut != null) {
            String chestName = chestnut.getName();
            if (chestName != null) {
                return chestName.concat("好好吃！");
            }
        } else {
            return null;
        }
        return null;
    }

    /**
     * 示例一可以简化成：
     */
    public static String test2(Chestnut chestnut) {
        return Optional.ofNullable(chestnut)
                .map(Chestnut::getName)
                .map(i -> i.concat("好好吃！"))
                .orElseThrow(()-> new RuntimeException("没有设置值"));
               // .orElse("没有设置值");
    }

    /**
     * 示例2 集合元素过滤
     */
    public static void main(String[] args) {
        // 创建一个栗子集合

        List<Chestnut> chestList = new ArrayList<>();

        // 创建几个栗子

        Chestnut chest1 = new Chestnut("abc");

        Chestnut chest2 = new Chestnut("efg");

        Chestnut chest3 = null;

        // 将栗子加入集合

        chestList.add(chest1);

        chestList.add(chest2);

        chestList.add(chest3);

        // 创建用于存储栗子名的集合

        List<String> nameList = new ArrayList();

        // 循环栗子列表获取栗子信息，值获取不为空且栗子名以‘a’开头

        // 如果不符合条件就设置默认值，最后将符合条件的栗子名加入栗子名集合

        for (Chestnut chest : chestList) {

            nameList.add(Optional.ofNullable(chest)

                    .map(Chestnut::getName)

                    .filter(value -> value.startsWith("a"))

                    .orElse("未填写"));
        }

        // 输出栗子名集合中的值

        System.out.println("通过 Optional 过滤的集合输出：");

        nameList.stream().forEach(System.out::println);
        System.out.println(test2(null));

    }
}
